/*!
 * # 数据实体类:
 *  OpMessage - 数据操作消息
 * 
 * # 描述:
 *  表示一条已经记录的数据操作日志消息。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Log.Mop.Data
{
	/// <summary>
	/// 数据操作消息。
	/// </summary>
	/// <remarks>
	/// 表示一条已经记录的数据操作日志消息。
	/// </remarks>
	public sealed class OpMessage : global::Pittypat.DataModel
	{
		#region 构造函数

		/// <summary>
		/// 初始化 OpMessage 类的一个新实例。
		/// </summary>
		public OpMessage()
		{
			// 消息 Id
			this.Id = null;
			// 用户 Id
			this.UserId = null;
			// 用户名称
			this.UserName = null;
			// 操作类型代码
			this.OpType = null;
			// 操作时间
			this.OpTime = null;
			// 数据库表名称
			this.TableNames = null;
			// 存储过程名称
			this.ProcName = null;
			// 是否成功
			this.Success = null;
			// 操作摘要
			this.Summary = null;
		}

		#endregion

		#region 属性

		/// <summary>
		/// 获取或者设置消息 Id。
		/// </summary>
		/// <remarks>
		/// 日志消息的 Id。
		/// </remarks>
		public @int64? Id { get; set; }

		/// <summary>
		/// 获取或者设置用户 Id。
		/// </summary>
		/// <remarks>
		/// 进行数据操作的目标用户的 Id，如果是系统操作，则为 null。
		/// </remarks>
		public @uuid? UserId { get; set; }

		/// <summary>
		/// 获取或者设置用户名称。
		/// </summary>
		public @string? UserName { get; set; }

		/// <summary>
		/// 获取或者设置操作类型代码。
		/// </summary>
		/// <remarks>
		/// 操作的类型代码：1-查询、2-添加、4-更新、8-删除、16-其他。
		/// </remarks>
		public @int8? OpType { get; set; }

		/// <summary>
		/// 获取或者设置操作时间。
		/// </summary>
		/// <remarks>
		/// 用户进行数据操作的时间。
		/// </remarks>
		public @datetime? OpTime { get; set; }

		/// <summary>
		/// 获取或者设置数据库表名称。
		/// </summary>
		/// <remarks>
		/// 所操作的目标数据库表的名称，多个之间使用 ',' 分隔。
		/// </remarks>
		public @string? TableNames { get; set; }

		/// <summary>
		/// 获取或者设置存储过程名称。
		/// </summary>
		/// <remarks>
		/// 执行操作的存储过程或函数的名称。
		/// </remarks>
		public @string? ProcName { get; set; }

		/// <summary>
		/// 获取或者设置是否成功。
		/// </summary>
		/// <remarks>
		/// 指示操作是否已经成功。
		/// </remarks>
		public @bool? Success { get; set; }

		/// <summary>
		/// 获取或者设置操作摘要。
		/// </summary>
		/// <remarks>
		/// 操作的摘要信息。
		/// </remarks>
		public @string? Summary { get; set; }

		#endregion

		#region 方法

		/// <summary>
		/// 从一个 DbDataReader 中读取此对象。
		/// </summary>
		/// <param name="reader">包含对象数据的 DbDataReader 对象。</param>
		/// <exception cref="global::System.ArgumentNullException">reader 是 null。</exception>
		public override void Read(global::System.Data.Common.DbDataReader reader)
		{
			if (reader == null)
			{
				throw new global::System.ArgumentNullException("reader");
			}

			// 消息 Id
			this.Id = reader.GetValue<@int64>("Id", defaultValue: this.Id);

			// 用户 Id
			this.UserId = reader.GetValue<@uuid>("UserId", defaultValue: this.UserId);

			// 用户名称
			this.UserName = reader.GetValue<@string>("UserName", defaultValue: this.UserName);

			// 操作类型代码
			this.OpType = reader.GetValue<@int8>("OpType", defaultValue: this.OpType);

			// 操作时间
			this.OpTime = reader.GetValue<@datetime>("OpTime", defaultValue: this.OpTime);

			// 数据库表名称
			this.TableNames = reader.GetValue<@string>("TableNames", defaultValue: this.TableNames);

			// 存储过程名称
			this.ProcName = reader.GetValue<@string>("ProcName", defaultValue: this.ProcName);

			// 是否成功
			this.Success = reader.GetValue<@bool>("Success", defaultValue: this.Success);

			// 操作摘要
			this.Summary = reader.GetValue<@string>("Summary", defaultValue: this.Summary);
		}

		/// <summary>
		/// 将当前对象作为 JSON 字符串写入指定的文本流。
		/// </summary>
		/// <param name="writer">目标文本流。</param>
		/// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
		public override void Write(global::System.IO.TextWriter writer)
		{
			if (writer == null)
			{
				throw new global::System.ArgumentNullException("writer");
			}

			writer.Write('{');

			// 消息 Id
			writer.Write("\"id\":");
			this.Id.Write(writer);
			writer.Write(',');

			// 用户 Id
			writer.Write("\"userId\":");
			this.UserId.Write(writer);
			writer.Write(',');

			// 用户名称
			writer.Write("\"userName\":");
			this.UserName.Write(writer);
			writer.Write(',');

			// 操作类型代码
			writer.Write("\"opType\":");
			this.OpType.Write(writer);
			writer.Write(',');

			// 操作时间
			writer.Write("\"opTime\":");
			this.OpTime.Write(writer);
			writer.Write(',');

			// 数据库表名称
			writer.Write("\"tableNames\":");
			this.TableNames.Write(writer);
			writer.Write(',');

			// 存储过程名称
			writer.Write("\"procName\":");
			this.ProcName.Write(writer);
			writer.Write(',');

			// 是否成功
			writer.Write("\"success\":");
			this.Success.Write(writer);
			writer.Write(',');

			// 操作摘要
			writer.Write("\"summary\":");
			this.Summary.Write(writer);

			writer.Write('}');
		}

		#endregion
	}
}
